package vue.FenetrePartie;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;

import modele.Position;


public class MapAdversaire extends JPanel implements MouseMotionListener, MouseListener, ActionListener{

	private static final long serialVersionUID = 1L;
	private Image background;
	private Panneau p;
	private vue.FenetrePartie.Unite uniteAttend;
	private boolean uniteAttendBool;
	private Quete panneauQuete;
	private JButton retour;
	
	
	/**
	 * 
	 * @param p, c'est le panneau principal qui contient les 4 panneaux de la partie.
	 * @param panneauQuete
	 * 
	 * Ce panneau sera placer en haut à gauche comme le panneau map.
	 * il ne sera visible uniquement quand le joueur voudra réaliser la dernière quête celle d'attaquer un village ennemie
	 */
	public MapAdversaire(Panneau p, Quete panneauQuete)
	{
		this.p = p;
		this.panneauQuete = panneauQuete;
		this.setSize(600, 495);
		this.setLocation(0,0);
		this.setLayout (null);
		this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		this.background = new ImageIcon("images/finies/map.png").getImage();
		this.uniteAttend = new vue.FenetrePartie.Unite(null);
		this.uniteAttendBool = false;
		

		
		this.retour = new JButton("retour partie");
		this.retour.setBounds(250, 150, 150, 50);
		
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		this.setVisible(false);
		this.p.add(this);

		this.rafraichir();
	}

	
	public void placerUnite(modele.Unite.Unite unite)
	{
		this.uniteAttendBool = true;
		this.uniteAttend.setUnite(unite);
		this.repaint();
	}
	
	public void init()
	{
		this.uniteAttendBool = false;
	}
	
	
	public void rafraichir() {

		
		this.removeAll();
		if(this.uniteAttendBool==true) this.add(this.uniteAttend.getButton());
		for(int i =0; i<this.p.getControleur().recupererListeBatimentEnnemi().size();i++)
		{
			vue.FenetrePartie.Batiment newBatiment = new vue.FenetrePartie.Batiment(this.p.getControleur().recupererListeBatimentEnnemi().get(i),true);
			Position pos = new Position(this.p.getControleur().recupererListeBatimentEnnemi().get(i).getPosition().getL(),this.p.getControleur().recupererListeBatimentEnnemi().get(i).getPosition().getC());
			pos = this.p.getControleur().PositionModeleToPositionVue(pos);
			newBatiment.getButton().setBounds(pos.getL(),pos.getC(),50,50);
			this.add(newBatiment.getButton());
		}
		
		
		for(int i =0; i<this.p.getControleur().recupererListeUniteAttaquanteEngagees().size();i++)
		{
			vue.FenetrePartie.Unite newUnite = new vue.FenetrePartie.Unite(this.p.getControleur().recupererListeUniteAttaquanteEngagees().get(i));
			Position pos = new Position(this.p.getControleur().recupererListeUniteAttaquanteEngagees().get(i).getPosition().getL(),this.p.getControleur().recupererListeUniteAttaquanteEngagees().get(i).getPosition().getC());
			pos = this.p.getControleur().PositionModeleToPositionVue(pos);
			newUnite.getButton().setBounds(pos.getL(),pos.getC(),50,50);
			this.add(newUnite.getButton());
		}


	
		if(!this.p.getControleur().EtreEnTrainDAttaquer())
		{
			this.add(this.retour);
			this.retour.addActionListener(this);
		}
		

		this.repaint();		
	}
	
	
	  public void paintComponent(Graphics g)
	  {
			super.paintComponent(g);
			g.drawImage(this.background, 0, 0, null);	
	  }

	  
	  /**
	   * Permet de placer une unitée s'il y en a une en attente
	   */
	@Override
	public void mouseClicked(MouseEvent arg0) {

		if(this.uniteAttendBool == true)
		{
			vue.FenetrePartie.Unite newUnite = new vue.FenetrePartie.Unite(this.uniteAttend.getUnite());
							
			newUnite.getButton().setBounds(this.uniteAttend.getButton().getX(),this.uniteAttend.getButton().getY(),50,50);
			this.uniteAttend.getUnite().setPosition(this.p.getControleur().PositionVueToPositionModele(new Position(this.uniteAttend.getButton().getX(),(int) this.uniteAttend.getButton().getY())));
			this.p.getControleur().placerUniteAttaquante(this.uniteAttend.getUnite());
			this.add(newUnite.getButton());
			
			
			if(this.uniteAttend.getUnite().getClass().getName()=="modele.Unite.Archer")
			{
				if(this.p.getControleur().getJoueur().getNbUniteArcher()==0) this.uniteAttendBool = false;
			}
			if(this.uniteAttend.getUnite().getClass().getName()=="modele.Unite.Soldat")
			{
				if(this.p.getControleur().getJoueur().getNbUniteSoldat()==0) this.uniteAttendBool = false;
			}
			if(this.uniteAttend.getUnite().getClass().getName()=="modele.Unite.Gobelin")
			{
				if(this.p.getControleur().getJoueur().getNbUniteGobelin()==0) this.uniteAttendBool = false;
			}
			if(this.uniteAttend.getUnite().getClass().getName()=="modele.Unite.Geant")
			{
				if(this.p.getControleur().getJoueur().getNbUniteGeant()==0) this.uniteAttendBool = false;
			}
			this.removeAll();
			this.rafraichir();
		}		
	}


	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * Permet de faire suivre une unités sur le curseur, s'il y en a une en attente
	 */
	@Override
	public void mouseMoved(MouseEvent e) {
		int ajoutX = 0, ajoutY = 0;
		if(e.getSource() == this.uniteAttend.getButton())
		{
			ajoutX = this.uniteAttend.getButton().getX();
			ajoutY = this.uniteAttend.getButton().getY();			
		}
		
		if(this.uniteAttendBool == true)
		{		
			this.remove(this.uniteAttend.getButton());
			this.uniteAttend = new vue.FenetrePartie.Unite(this.uniteAttend.getUnite());	
			this.uniteAttend.getButton().setBounds(e.getX()-25+ajoutX,e.getY()-25+ajoutY,50,50);
			this.uniteAttend.getButton().addMouseListener(this);
			this.uniteAttend.getButton().addMouseMotionListener(this);
			this.add(this.uniteAttend.getButton());
			this.repaint();
		}				
	}


	@Override
	public void actionPerformed(ActionEvent arg0) {

		this.panneauQuete.init();
	}

}
